package web

import (
	"fmt"
	"geetime_yk/constant"
	"strings"
)

type node struct {
	path     string
	pathType string
	pathVal  string
	regEx    string
	// children 子节点
	// 子节点的 path => node
	children map[string]*node
	// handler 命中路由之后执行的逻辑
	handler HandleFunc
}

/* trees 长这样子 ["post"]*node node里面还连着node
   childOrCreate方法的调用者会遍历pathArray，例如 /a/b/c
   如果已经存在/a/b，就把c挂在b下面
*/
func (n *node) childOrCreate(path string) *node {

	if n.children == nil {
		n.children = make(map[string]*node)
	}

	child, ok := n.children[path]
	if !ok {
		child = &node{path: path, pathType: ""}
		// 增加通配符类型的判断
		if path == constant.WildCard {
			child.pathType = constant.WildCard
		}

		// 处理url最后的参数
		if path[0:1] == constant.Colon {
			child.pathType = constant.Colon
			// 处理正则表达式的情况

			indexOfLeft := strings.IndexAny(path, "(")
			indexOfRight := strings.IndexAny(path, ")")

			if indexOfLeft != -1 && indexOfRight != -1 &&
				indexOfRight > indexOfLeft {
				// 可能存在正则表达式，但是否正的存在交给处理正则表达式的方法
				child.regEx = path[indexOfLeft : indexOfRight+1]
				fmt.Println(child.regEx)
			}

			// 这里改为匹配path用 : 代替
			path = path[0:1]
		}

		// c 找不到 创建node{path:"c"}
		n.children[path] = child
	}

	return child
}

/* 这是我写的,对比childOf()
漏了 n.children = nil的判断
而且 没有 res, ok := n.children[path] 直接
*/
func (n node) getChild(seg string) *node {
	if tempNode, ok := n.children[seg]; ok {
		return tempNode
	} else {
		return nil
	}
}

func (n *node) childOf(path string) (*node, bool) {
	if n.children == nil {
		return nil, false
	}

	res, ok := n.children[path]
	if ok {
		return res, ok
	}

	res, ok = n.children[constant.Colon]
	if ok {
		return res, ok
	}

	// * 的判断必须在最后
	res, ok = n.children[constant.WildCard]

	return res, ok

}
